package com.yyge;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.Maps;

import java.util.Map;
import java.util.Set;

/**
 *   简单理解：去重维护的集合
 *   BiMap<K, V> 就是一个 Map<K, V>，但是 它需要保证key和value都是唯一的，并且可以通过inverse()方法转换为BiMap<V, K>。
 *   当需要维护 key和value双向映射时，我们通常会这样实现：
 *   Map<String, Integer> nameToId = Maps.newHashMap();
 *   Map<Integer, String> idToName = Maps.newHashMap();
 *
 *   nameToId.put("Bob", 42);
 *   idToName.put(42, "Bob");
 *   ....
 *
 *  BitMap有以下实现类：
 *  HashBiMap：key和value都是HashMap
 *  HashBiMap：key和value都是ImmutableMap
 *  EnumBiMap：key和value都是EnumMap
 *  EnumHashBiMap：key是EnumMap，value是HashMap
 */
public class BiMapTest {
    public static void main(String[] args) {
        BiMap<String, Integer> bitMap = HashBiMap.create();

        bitMap.put("a", 1);
        bitMap.put("a", 2); // 重复的key会被替换

        // 重复的value会抛异常：java.lang.IllegalArgumentException: value already present: 2
        // bitMap.put("b", 2);

        // 强行放，会删除以前的value
        bitMap.forcePut("b", 2);

        System.out.println(bitMap);

        // 获取所有value
        Set<Integer> values = bitMap.values();

        // 所有key
        Set<String> strings = bitMap.keySet();

        // key和value倒置
        BiMap<Integer, String> inverse = bitMap.inverse();

    }
}
